#include <iostream>
#include <assert.h>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
int main()
{
    // 1.创建管道
    int pipefd[2] = {0};
    int n = pipe(pipefd);
    assert(n != -1); // debug下assert有效，release模式下assert无效
    (void)n;

    cout << pipefd[0] << endl;
    cout << pipefd[1] << endl;
    // 2.创建子进程
    pid_t id = fork();
    assert(id != -1);
    if (id == 0)
    {
        // 子进程
        close(pipefd[1]); // 关闭写端
        char buffer[1024];
        while (true)
        {
            // ssize_t 是有符号整数类型,从管道读取资源并放入到buffer里
            ssize_t s = read(pipefd[0], buffer, sizeof(buffer) - 1);
            if (s > 0) // 证明s读取成功
            {
                buffer[s] = 0; // 添加\0,\0的ASCII码值是0
                cout << "我从buffer里读取到父进程对我说:" << buffer << endl;
            }
        }
        exit(0);
    }
    // 父进程

    close(pipefd[0]); // 关闭读端
    string message = "我是父进程，我正在给你发消息";
    int count = 0;
    char send_buffer[1024];
    while (true)
    {
        // 制作缓冲区
        snprintf(send_buffer, sizeof(send_buffer), "%s : %d", message.c_str(), count++);
        // 写入，向管道写入要发送的内容
        write(pipefd[1], send_buffer, strlen(send_buffer));
        sleep(1);
    }
    // 等待子进程
    pid_t ret = waitpid(id, nullptr, 0);
    assert(ret > 0);
    (void)ret;
    // 父进程把写端关闭t
    close(pipefd[1]);
    return 0;
}